package week7.ui;

import week7.kaarten.*;

import java.util.*;

public class HandTUI extends TUI {
    static public void main(String[] args) {
        new HandTUI().start();
    }

    /** De hand waarop dit interface werkt. */
    private final FlexHand hand = new FlexHand();

    public HandTUI() {
        super("Simulatie van een hand kaarten");
        addActie(new GetOrdening());
        addActie(new Print());
        addActie(new Plus());
        addActie(new SetOrdening());
        addActie(new Verwijder());
    }

    /** 
     * Test of een String een kaart-afkorting is.
     * De afkorting dient uit twee tekens te bestaan:
     * 1e teken = kleursymbool, 2e teken = rangsymbool
     * @param tekst te testen String
     * @require <tt>tekst != null</tt>
     * @ensure <tt>result == true</tt> alsla <ul>
     * <li> <tt>tekst.length() == 2</tt>, 
     * <li> <tt>tekst.charAt(0)</tt> is een kleursymbool en 
     * <li> <tt>tekst.charAt(1)</tt> is een rangsymbool </ul>
     */
    boolean isKaart(String tekst) {
	return tekst.length() == 2
	    && Kaart.geldigeKleur(tekst.charAt(0))
	    && Kaart.geldigeRang(tekst.charAt(1));
    }

    /** 
     * Converteert een String naar een Kaart
     * @param tekst afkorting van 2 tekens voor een kaart;
     *              1e teken = kleursymbool, 2e teken = rangsymbool
     * @require <tt>tekst != null, isKaart(tekst)</tt>
     * @ensure <tt>result != null</tt>
     */
    Kaart toKaart(String tekst) {
	return new Kaart(tekst.charAt(0), tekst.charAt(1));
    }

    public class GetOrdening extends Actie {
		protected GetOrdening() {
			super('g', 0, " .......... geef de ordening weer");
		}

		@Override
		public void voerUit(List<String> arg0) {
			if(hand.getOrdening() instanceof RangKleurOrdening) {
				System.out.println("Rang-Kleur Ordening");
			} else if (hand.getOrdening() instanceof KleurRangOrdening) {
				System.out.println("Kleur-Rang Ordening");
			} else {
				System.out.println(hand.getOrdening());
			}
		}
    	
    }
    
    // Voegt een kaart aan de hand toe.
    public class Plus extends Actie {
        private Plus() {
            super('+', 1, "[kaart] ... voeg nieuwe kaart toe");
        }

        public boolean parsCorrect(List<String> pars) {
            if (isKaart(pars.get(0))) {
                return true;
            } else {
                System.out.println("Parameter "+pars.get(0)+
                                   " is geen correcte kaart");
                return false;
            }
        }

        public void voerUit(List<String> pars) {
            if(hand.add(toKaart(pars.get(0)))) {
            	System.out.println("Kaart is succesvol toegevoegd.");
            } else {
            	System.out.println("Er is een fout opgetreden bij het toevoegen van deze kaart. \n" +
            			"Mogelijke oorzaken zijn: \n" +
            			"    1. Deze hand bevatte al een kaart " + pars.get(0) + ".");
            }
        }
    }

    // Print de hand
    public class Print extends Actie {
        private Print() {
            super('p', 0, " [ord] .... laat de hand zien");
        }

        public void voerUit(List<String> pars) {
            System.out.println("Hand:");
            System.out.println(hand);
        }
    }
    
    // Verander de ordening
    public class SetOrdening extends Actie {
    	private SetOrdening() {
    		super('o', 1, " .......... stel een nieuwe ordening in");
    	}
    	
    	public boolean parsCorrect(List<String> pars) {
            return pars.get(0).length() == 2 && pars.get(0).contains("r") && pars.get(0).contains("k");
        }

		@Override
		public void voerUit(List<String> pars) {
			if(pars.get(0).equals("rk")) {
				hand.setOrdening(new RangKleurOrdening());
				System.out.println("De ordening is succesvol veranderd.");
			} else if (pars.get(0).equals("kr")){
				hand.setOrdening(new KleurRangOrdening());
				System.out.println("De ordening is succesvol veranderd.");
			} else {
				System.out.println("Er is een fout opgetreden bij het veranderen van de ordening.");
			}
		}
    }
    
    // Verwijdert een kaart uit deze hand.
    public class Verwijder extends Actie {
        private Verwijder() {
            super('-', 1, "[kaart] ... verwijder deze kaart");
        }

        public boolean parsCorrect(List<String> pars) {
            if (pars.size() == 1 && pars.get(0).length() == 2 && isKaart(pars.get(0))) {
                return true;
            } else {
                System.out.println("Parameter "+pars.get(0)+
                                   " is geen (correcte) kaart uit deze hand");
                return false;
            }
        }

        public void voerUit(List<String> pars) {
            if(hand.remove(toKaart(pars.get(0)))) {
            	System.out.println("Kaart " + pars.get(0) + " is succesvol verwijderd.");
            } else {
            	System.out.println("Er is een fout opgetreden bij het verwijderen van deze kaart. \n" +
            			"Mogelijke oorzaken zijn: \n" +
            			"    1. Deze hand geen kaart " + pars.get(0) + ".");
            }
        }
    }
}
